﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Ferreteria.Clases;

namespace Ferreteria.Forms.GestionPedidos
{

    public partial class FrmFacturaCae : Form
    {

        DisancoEntities context;
        int idvta;
        DataTable dtLineas;
        decimal subtotal;
        decimal iva;
        int autorizacionId;
        long numeroFactura;
        long NroFactura;
        Ventas VentaImprimir;
        decimal descuento;
        decimal subtotal_descontado;
        public static int ventaid;
        bool pendiente;
        int NumeroRemito;
        decimal incrementoventa;

        private Font miniprintFont = new Font("Calibri", 7);
        private Font printFont = new Font("Calibri", 8);
        private Font printFontNormal10 = new Font("Calibri", 10);
        private Font printFontTit = new Font("Calibri", 12);
        private Font printFontTotal = new Font("Calibri", 13);


        public FrmFacturaCae(int ventaid)
        {
            InitializeComponent();

            idvta = ventaid;

            context = new DisancoEntities(Ferreteria.Clases.Constantes.cadenaConexion);

            var factura = context.Ventas.FirstOrDefault(v => v.id_venta == idvta);
            var cliente = factura.Clientes;
            cmbTipo.DataSource = Funcion.obtenerTiposFactura(factura.Clientes.CondicionIVA.condicion_sigla);
            bool autorizado = buscarAutorizaciones(cmbTipo.SelectedItem.ToString());

            int nroLineas = factura.LineaVenta.Count;

            //Obtener las condiciones de iva disponibles
            cmbTipo.DataSource = Funcion.obtenerTiposFactura(factura.Clientes.CondicionIVA.condicion_sigla);

            //bool autorizado = buscarAutorizaciones(cmbTipo.SelectedItem.ToString());

            if (autorizado)
            {
                //Cargar datos del cliente
                txtbCliNombre.Text = factura.Clientes.cliente_nombre;
                txtbCliLocalidad.Text = factura.Clientes.cliente_localidad;
                txtbCliDireccion.Text = factura.Clientes.cliente_direccion;
                txtbCliCondiva.Text = factura.Clientes.CondicionIVA.condicion_sigla;
                txtbCliCuit.Text = factura.Clientes.cliente_cuit;

                cargarLineasPedido();

                calcularTotales();
            }
            else
            {
                MessageBox.Show("No se encontraron autorizaciones validas activas");
            }

        }



        private int CheckNumber(long number, string type)
        {
            //Verifica si el numero en cuestion ya fue utilizado anteriormente.
            //Los resultados posibles son:
            //0: Ocurrio un error al buscar los numeros
            //1: El numero no fue ocupado aun
            //2: El numero ya fue ocupado

            try
            {
                using (var context = new DisancoEntities(Ferreteria.Clases.Constantes.cadenaConexion))
                {
                    var query = context.Ventas.Where(x => x.venta_tipo_comprobante == type).Where(x => x.venta_nro_inicio == number);

                    if (query.Count() > 0)
                        return 2;
                    else
                        return 1;
                }
            }
            catch (Exception err)
            {
                MessageBox.Show(err.Message);
                return 0;
            }
        }

        void calcularTotales()
        {
            descuento = numDescuento.Value / 100;
            subtotal_descontado = Funcion.SubtotDescuento(subtotal, descuento);

            iva = Math.Round((subtotal_descontado * (Clases.Constantes.IVA)), 2);

            txbIva.Text = iva.ToString("0.00");
            txbSubTotDesc.Text = subtotal_descontado.ToString("0.00");

            string tipo = cmbTipo.SelectedItem.ToString();
            switch (tipo)
            {
                case "A":
                    {
                        txbTotal.Text = (subtotal_descontado + iva).ToString("0.00");
                        txbIva.Enabled = true;
                        break;
                    }
                case "X":
                    {
                        txbTotal.Text = (subtotal_descontado).ToString("0.00");
                        txbSubTotal.Enabled = false;
                        txbIva.Enabled = false;
                        break;
                    }
                case "B":
                    {
                        txbTotal.Text = (subtotal_descontado).ToString("0.00");
                        txbSubTotDesc.Enabled = false;
                        txbSubTotDesc.Text = "";
                        txbIva.Enabled = false;
                        txbIva.Text = " ";
                        txbSubTotal.Text = Convert.ToString(subtotal);
                        break;
                    }
                default:
                    {
                        txbTotal.Text = (subtotal_descontado + iva).ToString("0.00");
                        txbIva.Enabled = true;
                        break;
                    }
            }
        }

        void cargarLineasPedido()
        {
            context = new DisancoEntities(Ferreteria.Clases.Constantes.cadenaConexion);
            decimal preciounitfila;
            decimal preciototfila;
            dtLineas = new DataTable();
            dtLineas.Columns.Add("id");
            dtLineas.Columns.Add("Cantidad");
            dtLineas.Columns.Add("Codigo Art");
            dtLineas.Columns.Add("Articulo");
            dtLineas.Columns.Add("Precio Unitario");
            dtLineas.Columns.Add("Bonif");
            dtLineas.Columns.Add("Precio Bonif");
            dtLineas.Columns.Add("Precio Total");

            subtotal = 0;
            decimal preciosiniva;


            var factura = context.Ventas.FirstOrDefault(v => v.id_venta == idvta);

            foreach (var linea in factura.LineaVenta)
            {
                preciounitfila = 0;
                DataRow fila = dtLineas.NewRow();
                fila["id"] = linea.art_id;
                fila["Articulo"] = linea.Articulos.art_nombre;
                fila["Codigo Art"] = linea.Articulos.art_codigo;
                fila["Cantidad"] = linea.cantidad_venta;
                fila["Bonif"] = linea.oferta_bonif;


                preciosiniva = Math.Round((linea.precio_venta / (1 + Clases.Constantes.IVA)), 2);

                //decimal preciounitincrementado = Math.Round(preciosiniva + (preciosiniva * incrementoventa), 2);
                decimal preciounitincrementado = Math.Round(preciosiniva * (1 + incrementoventa), 2);

                if ((string)cmbTipo.SelectedItem == "B")
                {
                    decimal precioincrementadodeB = linea.precio_venta * (1 + incrementoventa);
                    //decimal precioincrementadodeB = linea.ped_precio + (linea.ped_precio * incrementoventa);
                    fila["Precio Unitario"] = "$ " + Math.Round(precioincrementadodeB, 2);
                    decimal preciobonif = Math.Round((Funcion.PrecioBonificado(precioincrementadodeB, linea.oferta_bonif)), 2);
                    fila["Precio Bonif"] = "$ " + Math.Round(preciobonif, 2);
                    preciounitfila = Math.Round(preciobonif, 2);
                }
                else
                {

                    fila["Precio Unitario"] = "$ " + preciounitincrementado;
                    fila["Precio Bonif"] = "$ " + Math.Round(Funcion.PrecioBonificado(preciounitincrementado, linea.oferta_bonif), 2);
                    preciounitfila = Math.Round(Funcion.PrecioBonificado(preciounitincrementado, linea.oferta_bonif), 2);
                }
                fila["Precio Total"] = "$ " + Math.Round((preciounitfila * linea.cantidad_venta), 2);
                preciototfila = Math.Round((preciounitfila * linea.cantidad_venta), 2);
                dtLineas.Rows.Add(fila);
                subtotal += Math.Round(preciototfila, 2);

            }

            subtotal = Math.Round(subtotal, 2);

            txbSubTotal.Text = subtotal.ToString("0.00");

            dgvListaArt.DataSource = dtLineas;
            dgvListaArt.Columns["id"].Visible = false;
            dgvListaArt.Columns["Articulo"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
            dgvListaArt.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
            dgvListaArt.ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
        }

        private bool buscarAutorizaciones(string tipo)
        {
            context = new DisancoEntities(Ferreteria.Clases.Constantes.cadenaConexion);

            foreach (var auth in context.Autorizaciones)
            {
                if (auth.autorizacion_tipo_comp == tipo &&
                    auth.autorizacion_estado &&
                    auth.autorizacion_limite_fecha.Date > DateTime.Now.Date)
                {
                    autorizacionId = auth.autorizacion_id;
                    numeroFactura = auth.autorizacion_ultimo_numero + 1;

                    if (numeroFactura > auth.autorizacion_limite_max)
                    {
                        MessageBox.Show("No quedan numeros de disponibles para Comprobantes Tipo" + tipo, "Disanco Sanitarios", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        btnEmitir.Enabled = false;
                        txbFacturaNumero.Enabled = false;
                        return false;
                    }
                    else
                    {
                        txbFacturaNumero.Text = numeroFactura.ToString("000000000000");

                        return true;
                    }
                }

            }

            return false;
        }

        private void cmbTipo_SelectedIndexChanged(object sender, EventArgs e)
        {
            bool autorizado = buscarAutorizaciones(cmbTipo.SelectedItem.ToString());
            if (autorizado)
            {
                cargarLineasPedido();
                calcularTotales();
            }
            else
            {
                MessageBox.Show("No se encontraron autorizaciones validas activas");
                btnEmitir.Enabled = false;
            }
        }
        
        void imprimir()
        {
            //NroFactura = numeroFactura;

            pdFacturaUnicaA.PrinterSettings.Copies = 3;
            printDialog.Document = pdFacturaUnicaA;// Si hay q imprimir una sola Factura 
            DialogResult resultadounico = printDialog.ShowDialog();

            if (resultadounico == DialogResult.OK)
            {

                pdFacturaUnicaA.PrinterSettings = printDialog.PrinterSettings;
                printPreviewDialog.Document = pdFacturaUnicaA;
                ((Form)printPreviewDialog).WindowState = FormWindowState.Maximized;
                printPreviewDialog.ShowDialog();

            }
        }

        private void btnCancelar_Click_1(object sender, EventArgs e)
        {
            this.Close();
        }

        private void btnEmitir_Click_1(object sender, EventArgs e)
        {
            try
            {
                context = new DisancoEntities(Ferreteria.Clases.Constantes.cadenaConexion);

                //numeroFactura = Convert.ToInt64(txbFacturaNumero.Text.Replace("-", ""));
                var factura = context.Ventas.FirstOrDefault(v => v.id_venta == idvta);
                factura.venta_estado = Estado.ConCae;
                // faltaria guardar nro factura cae y fecha vto

                context.SaveChanges();

                //MessageBox.Show("Factura Generada Correctamente", "Operación Exitosa!!", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);

                DialogResult dr = MessageBox.Show("¿Desea Imprimir esta factura?", "Imprimir", MessageBoxButtons.YesNo, MessageBoxIcon.Question);

                if (dr == System.Windows.Forms.DialogResult.Yes)
                {
                    //VentaImprimir = new Ventas();
                    //VentaImprimir = nuevaVenta;
                    imprimir();
                    this.Close();
                }

            }
            catch (Exception err)
            {
                MessageBox.Show(err.Message);
            }



        }

        private void pdFacturaUnicaA_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
        {
            context = new DisancoEntities(Ferreteria.Clases.Constantes.cadenaConexion);

            int margenX = 25;
            int margenY = 50;
            int anchoHoja = 800;

            PointF punto = new PointF();
            punto.X = anchoHoja / 2;
            punto.Y = margenY + 30;

            StringFormat formato = new StringFormat();
            formato.Alignment = StringAlignment.Center;

            VentaImprimir =  context.Ventas.FirstOrDefault(v => v.id_venta == idvta);

            string factnumero = VentaImprimir.venta_nro_inicio.ToString(); ////

            string fecha = VentaImprimir.venta_fecha.Date.ToString("dd/MM/yyyy");
            //e.Graphics.DrawLine(Pens.Black, 580, 52, 583, 52);
            e.Graphics.DrawString((factnumero.Substring(1, 8)), miniprintFont, Brushes.Black, 585, 63);
           
            e.Graphics.DrawString("Fecha:", printFontTit, Brushes.Black, 500, 75);
            e.Graphics.DrawString(fecha, printFontTit, Brushes.Black, 570, 75);
            //e.Graphics.DrawLine(Pens.Black, 10, 120, 800, 120);
            e.Graphics.DrawString(VentaImprimir.Clientes.cliente_nombre, printFontNormal10, Brushes.Black, 130, 186);
            e.Graphics.DrawString(VentaImprimir.Clientes.cliente_direccion, printFontNormal10, Brushes.Black, 130, 201);
            e.Graphics.DrawString(VentaImprimir.Clientes.cliente_localidad, printFontNormal10, Brushes.Black, 450, 201);
            e.Graphics.DrawString(VentaImprimir.Clientes.CondicionIVA.condicion_sigla, printFontNormal10, Brushes.Black, 130, 216);
            e.Graphics.DrawString(VentaImprimir.Clientes.cliente_cuit, printFontNormal10, Brushes.Black, 450, 216);
            //e.Graphics.DrawLine(Pens.Black, 10, 200, 800, 200);

            e.Graphics.DrawString("Cliente:", printFontNormal10, Brushes.Black, 90, 186, formato);
            e.Graphics.DrawString("Dirección:", printFontNormal10, Brushes.Black, 80, 201, formato);
            e.Graphics.DrawString("Localidad:", printFontNormal10, Brushes.Black, 400, 201, formato);
            e.Graphics.DrawString("Cond. IVA:", printFontNormal10, Brushes.Black, 80, 216, formato);
            e.Graphics.DrawString("CUIT:", printFontNormal10, Brushes.Black, 415, 216, formato);
            e.Graphics.DrawLine(Pens.Black, 10, 120, 800, 120);
            e.Graphics.DrawLine(Pens.Black, 10, 200, 800, 200);
            e.Graphics.DrawImage(pictureBox1.Image, 10, 10);
            e.Graphics.DrawLine(Pens.Black, 10, 1005, 825, 1005);

            //if (pendiente)
            //{
            //    e.Graphics.DrawString("Remito:", printFontNormal10, Brushes.Black, 615, 216, formato);
            //    e.Graphics.DrawString(Convert.ToString(NumeroRemito.ToString("0000-00000000")), printFontNormal10, Brushes.Black, 665, 216);
            //}

            int lineainencabezado = 125;
            String Cant = "Cantidad";
            e.Graphics.DrawString(Cant, printFontNormal10, Brushes.Black, 24, lineainencabezado);
            String Cod = "Codigo";
            e.Graphics.DrawString(Cod, printFont, Brushes.Black, 83, lineainencabezado + 3);
            String Art = "Articulo";
            e.Graphics.DrawString(Art, printFontNormal10, Brushes.Black, 315, lineainencabezado);
            String PrecioU = "Precio U";
            e.Graphics.DrawString(PrecioU, printFontNormal10, Brushes.Black, 575, lineainencabezado);
            String Bonif = "Bonif.";
            e.Graphics.DrawString(Bonif, printFontNormal10, Brushes.Black, 635, lineainencabezado);
            String PrecioOf = "Precio Bon";
            e.Graphics.DrawString(PrecioOf, printFontNormal10, Brushes.Black, 675, lineainencabezado);
            String Importe = "Total";
            e.Graphics.DrawString(Importe, printFontNormal10, Brushes.Black, 757, lineainencabezado);

            //Proceso de dibujado de las lineas de factura
            int posY = 275;
            int anchoLinea = 20;
            int posCantidad = margenX + 15;
            int posCod = posCantidad + 42;
            int posArticulo = posCod + 55;
            int posPrecioU = posArticulo + 440;
            int posBonif = posPrecioU + 57;
            int posPrecioOf = posBonif + 51;
            int posPrecioT = posPrecioOf + 62;

            foreach (DataRow fila in dtLineas.Rows)
            {
                e.Graphics.DrawString(fila["Cantidad"].ToString(), printFontNormal10, Brushes.Black, posCantidad, posY);
                e.Graphics.DrawString(fila["Codigo Art"].ToString(), printFont, Brushes.Black, posCod, posY + 3);
                e.Graphics.DrawString(fila["Articulo"].ToString(), printFontNormal10, Brushes.Black, posArticulo, posY);
                e.Graphics.DrawString(fila["Precio Unitario"].ToString(), printFontNormal10, Brushes.Black, posPrecioU, posY);
                decimal bon = (Convert.ToDecimal(fila["Bonif"].ToString()));
                if (bon > 0)
                {
                    string nuevobon = bon.ToString("0.00 %");
                    e.Graphics.DrawString(nuevobon, printFontNormal10, Brushes.Black, posBonif, posY);
                }
                e.Graphics.DrawString(fila["Precio Bonif"].ToString(), printFontNormal10, Brushes.Black, posPrecioOf, posY);
                e.Graphics.DrawString(fila["Precio Total"].ToString(), printFontNormal10, Brushes.Black, posPrecioT, posY);

                posY += anchoLinea;
            }

            int lineafin = 995;
            int lineafinletrachica = 997;
            int posSubtotX = 22;
            decimal total = Math.Round((Convert.ToDecimal(VentaImprimir.venta_monto)), 2);

            // Comentario abajo Factura A y B
            string comentariox = txtbComentarioAB.Text;
            e.Graphics.DrawString(comentariox, printFont, Brushes.Black, posSubtotX + 48 , lineafin - 45);
            
            
            if ((string)cmbTipo.SelectedItem == "A")
            {
                String subtot = "SUB-TOT $";
                e.Graphics.DrawString(subtot, printFontNormal10, Brushes.Black, posSubtotX + 8, lineafinletrachica);
                e.Graphics.DrawString(Convert.ToString(subtotal), printFontNormal10, Brushes.Black, posSubtotX + 81, lineafinletrachica);

                decimal descuento = Math.Round((VentaImprimir.venta_subtotal * VentaImprimir.venta_descuento),2);
                              
                //decimal descuento = Math.Round(Convert.ToDecimal((VentaImprimir.venta_subtotal) - (VentaImprimir.venta_monto - VentaImprimir.venta_iva)), 2);
                String desc = "DESC $";
                e.Graphics.DrawString(desc, printFontNormal10, Brushes.Black, posSubtotX + 160, lineafinletrachica);
                e.Graphics.DrawString(VentaImprimir.venta_descuento.ToString("0.00 %"), miniprintFont, Brushes.Black, posSubtotX + 209, lineafinletrachica + 4);
                e.Graphics.DrawString(Convert.ToString(descuento), printFontNormal10, Brushes.Black, posSubtotX + 242, lineafinletrachica);

                String subtotdesc = "SUB-TOT Desc $";
                decimal subtotaldesc = Math.Round(Convert.ToDecimal((VentaImprimir.venta_subtotal) - (descuento)), 2);
                e.Graphics.DrawString(subtotdesc, printFontNormal10, Brushes.Black, posSubtotX + 313, lineafinletrachica);
                e.Graphics.DrawString(Convert.ToString(subtotaldesc), printFontNormal10, Brushes.Black, posSubtotX + 418, lineafinletrachica);
                
                String iva = "IVA $";
                e.Graphics.DrawString(iva, printFontTit, Brushes.Black, posSubtotX + 500, lineafin);
                e.Graphics.DrawString(Convert.ToString(VentaImprimir.venta_iva), printFontTit, Brushes.Black, posSubtotX + 550  , lineafin);

                String tot = "TOTAL $";
                e.Graphics.DrawString(tot, printFontTit, Brushes.Black, posSubtotX + 627, lineafin);
                e.Graphics.DrawString(Convert.ToString(total), printFontTotal, Brushes.Black, posSubtotX + 702, lineafin);
            }
            else
            {
                String subtot = "SUB-TOTAL $";
                e.Graphics.DrawString(subtot, printFontTit, Brushes.Black, posSubtotX + 178, lineafin);
                e.Graphics.DrawString(Convert.ToString(VentaImprimir.venta_subtotal), printFontTit, Brushes.Black, posSubtotX + 272, lineafin);

                //decimal descuento = Math.Round(Convert.ToDecimal(VentaImprimir.venta_subtotal - VentaImprimir.venta_monto), 2);
                decimal descuento = Math.Round((VentaImprimir.venta_subtotal * VentaImprimir.venta_descuento), 2);
                String desc = "Descuento $";
                e.Graphics.DrawString(desc, printFontTit, Brushes.Black, posSubtotX + 370, lineafin);
                e.Graphics.DrawString(Convert.ToString(descuento), printFontTit, Brushes.Black, posSubtotX + 505, lineafin);
                e.Graphics.DrawString(VentaImprimir.venta_descuento.ToString("0.00 %"), miniprintFont, Brushes.Black, posSubtotX + 465, lineafin + 4);

                String tot = "TOTAL $";
                e.Graphics.DrawString(tot, printFontTit, Brushes.Black, posSubtotX + 570, lineafin);
                e.Graphics.DrawString(Convert.ToString(total), printFontTotal, Brushes.Black, posSubtotX + 650, lineafin);
            }


        }



        private void numDescuento_ValueChanged(object sender, EventArgs e)
        {
            descuento = numDescuento.Value / 100;

            calcularTotales();
        }

        private void txbFacturaNumero_TextChanged(object sender, EventArgs e)
        {
            btnEmitir.Enabled = false;
            txbFacturaNumero.BackColor = SystemColors.Window;
            string textNumber = txbFacturaNumero.Text.Replace(" ", "").Replace("-", "");

            if (textNumber.Length == 12)
            {
                long longNumber = Convert.ToInt64(textNumber);
                string factTipo = cmbTipo.SelectedItem.ToString();
                int statusNumber = CheckNumber(longNumber, factTipo);                

                switch (statusNumber)
                {
                    case 0:
                        txbFacturaNumero.BackColor = Color.Red;
                        break;
                    case 1:
                        txbFacturaNumero.BackColor = Color.LightGreen;
                        btnEmitir.Enabled = true;
                        break;
                    case 2:
                        txbFacturaNumero.BackColor = Color.Red;
                        break;
                }
            }
        }
    }


        }
    
        
    
    
    